/**
 * @file    common_button.c
 * @author  yhy
 * @brief   按键组件
 * @version 1.0
 * @date    2025-07-09
 *
 * @copyright Copyright (c) 2025
 *
 * Change Logs:
 * Date           Author       Notes
 * 2025-07-02     yhy          the first version V1.00
 *
 */
#include "common_button.h"

#include "multi_button.h"

/* 适配器函数声明, 用于适配回调函数参数不同的问题 */
static void common_button_callback_adapter(Button *handle);

/* 按键列表 */
static Button button_list[BUTTON_ID_MAX];

/* 按键配置列表 */
static button_t *button_config_list[BUTTON_ID_MAX] = { NULL };

/**
 * @brief  初始化按键, 初始化不涉及事件回调函数的注册
 *
 * @param button        按键配置
 * @return result_e     初始化结果
 */
result_e common_button_init(const button_t *button)
{
    /* 参数校验 */
    if (!button || !button->get_gpio_level || button->id >= BUTTON_ID_MAX) {
        return RESULT_STATUS_INVALID_PARAM;
    }

    /* 保存按键配置指针，用于适配器函数中查找 */
    button_config_list[button->id] = (button_t *)button;

    /* 初始化按键, 并注册进按键链表 */
    button_init(&button_list[button->id], button->get_gpio_level, button->active_level, button->id);
    if (button_start(&button_list[button->id])) {
        return RESULT_STATUS_BUTTON_FULL;
    }

    return RESULT_STATUS_OK;
}

/**
 * @brief  注册按键事件回调函数
 *
 * @param button        按键结构体指针
 * @param event         按键事件
 * @param callback      回调函数
 * @return result_e     注册结果
 */
result_e common_button_register_callback(button_t *button, button_event_e event, button_callback_f callback)
{
    /* 参数校验 */
    if (!button || button->id >= BUTTON_ID_MAX || event >= BUTTON_EVENT_MAX) {
        return RESULT_STATUS_INVALID_PARAM;
    }

    /* 保存用户回调函数到按键配置中 */
    button->callback_list[event] = callback;
    button_attach(&button_list[button->id], (ButtonEvent)event, common_button_callback_adapter);

    return RESULT_STATUS_OK;
}

/**
 * @brief 放入5ms调度器中调度
 *
 */
void common_button_scan(void) { button_ticks(); }

/**
 * @brief  按键回调适配器函数
 *         将multi_button的Button*参数转换为button_t*参数
 *
 * @param btn_handle    multi_button的按键句柄
 */
static void common_button_callback_adapter(Button *btn_handle)
{
    if (!btn_handle) {
        return;
    }

    /* 获取按键ID */
    uint8_t button_id = btn_handle->button_id;
    if (button_id >= BUTTON_ID_MAX) {
        return;
    }

    /* 获取按键配置 */
    button_t *button_config = button_config_list[button_id];
    if (!button_config) {
        return;
    }

    /* 获取当前事件 */
    ButtonEvent multi_event = button_get_event(btn_handle);
    if (multi_event >= BUTTON_EVENT_MAX) {
        return;
    }

    /* 获取用户注册的回调函数 */
    button_callback_f user_callback = button_config->callback_list[(uint32_t)multi_event];
    if (user_callback) {
        /* 调用用户回调函数，传入button_t*参数 */
        user_callback((void *)button_config);
    }
}
